]> dgit.raspbian.org Git - gnome-shell.git/commitdiff
shell/app: Warn instead of crashing if disposed before startup notification
authorDaniel van Vugt <daniel.van.vugt@canonical.com>
Thu, 29 Aug 2024 07:19:14 +0000 (15:19 +0800)
committerPeter Michael Green <plugwash@raspbian.org>
Sat, 13 Jun 2026 12:18:33 +0000 (12:18 +0000)
This is currently easy to reproduce by launching and immediately closing
Chrome, then closing the shell. But automated crash reports show it can
also happen while using the shell, during a garbage collection run.

It's currently the top gnome-shell crasher in Ubuntu, and mostly with
Chromium/Electron apps. But regardless of the offender, we shouldn't
ever trust application behaviour to keep the shell alive.

Bug: https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/7045
Bug-Ubuntu: https://bugs.launchpad.net/bugs/2037055
Forwarded: https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/3457

Gbp-Pq: Name shell-app-Warn-instead-of-crashing-if-disposed-before-sta.patch

src/shell-app.c

index acb996c0ba58094eef26f06478e0a121e63e2c41..512d9f80e814190beb177f47a48a9c578ff3653d 100644 (file)
@@ -1764,14 +1764,32 @@ shell_app_dispose (GObject *object)
 {
   ShellApp *app = SHELL_APP (object);
 
-  g_clear_object (&app->info);
   g_clear_object (&app->fallback_icon);
 
   while (app->running_state)
     _shell_app_remove_window (app, app->running_state->windows->data);
 
-  /* We should have been transitioned when we removed all of our windows */
-  g_assert (app->state == SHELL_APP_STATE_STOPPED);
+  if (app->state != SHELL_APP_STATE_STOPPED && app->info)
+    {
+      const char *name = g_desktop_app_info_get_generic_name (app->info);
+      const char *file_name = g_desktop_app_info_get_filename (app->info);
+
+      if (!name)
+        name = "(name unknown)";
+
+      if (!file_name)
+        file_name = "(filename unknown)";
+
+      g_warning ("App \"%s\" (%s) claims to still be %s when being disposed. "
+                 "Please ask the app developer to check if StartupNotify=true "
+                 "in the .desktop file is properly implemented.",
+                 name,
+                 file_name,
+                 app->state == SHELL_APP_STATE_STARTING ? "starting" :
+                                                          "running");
+    }
+
+  g_clear_object (&app->info);
   g_assert (app->running_state == NULL);
 
   G_OBJECT_CLASS(shell_app_parent_class)->dispose (object);